#ifndef HOUSE_H_
#define HOUSE_H_
#define NUM_MAX_REQUERENTES_FORNO 6
#include <pthread.h>
#include "monitor.h"

//Estrutura para guardar informações sobre cada usuário
typedef struct DadosPersonagem
{
	char nome[10];
	int numero; //Mesmo número de cada personagem ("monitor.h").
} DadosPersonagem;

DadosPersonagem dados[NUM_MAX_REQUERENTES_FORNO];

//Estrutura
typedef struct Fila
{
	int numero;
	int quantidadeDeUso;
}Fila;

Fila fila[1000];

/*
 * Inicia organização da casa
 */
void iniciaCasa(DadosPersonagem personagens[]);

/*
 * Procedimento que irá gerenciar todo o programa, criando threads, mutex, cond, e desalocando as mesmas
 */
void iniciaProblema();

/*
 * Procedimento para iniciar a fila de prioridade.
 * Tamanho da fila, 100 posições.
 * Posição vazia recebe -1 na variavel número. Posição ocupada recebe na variável número o valor do número do personagem.
 */
void iniciaFila();

/*
 * Inicia os valores dos Personagens:
 * 0 - Sheldon
 * 1 - Amy
 * 2 - Leonard
 * 3 - Penny
 * 4 - Howard
 * 5 - Bernardete
 */
void iniciaValoresPersonagens(Personagem *personagens, Monitor *m);

/*
 * Inicia Mediador.
 * Parâmetro 1: Referência para o Monitor
 * Parâmetro 1: Referência para o mediador
 */
void iniciaMediador(Monitor *m, Personagem *mediador);

/*
 * Adiciona na fila o personagem passado no primeiro parâmetro.
 * Parâmetro 1: Número do personagem
 * Parâmetro 2: Quantidade de vezes que o personagem já utilizou o forno
 */
void adicionaFila(int numero, int quantidade);

/*
 * Remove da fila o personagem passado no primeiro parâmetro
 * Parâmetro 1: Número do personagem
 */
void removeFila(int numero);
/*
 * Remove primeiro personagem da fila.
 * Retorno: Número do personagem retirado.
 */
int removePrimeiroDaFila();

/*
 * Verifica se existe o personagem na fila.
 * Parâmetro 1: Número do personagem
 * Retorno: 0 se não existe na fila, 1 se existe.
 */
int verificaSeExisteNaFila(int numero);

/* Procedimento para veriricar na tabela de usuários, qual é o nome do mesmo, dado um número passado no parâmetro
 * Parâmetro 1: Número do personagem
 * Retorno: Nome do personagem
 */
char *qualPersonagem(int numero);

/*
 * Função que verifica o tamanho da fila de espera para uso do forno
 * Retorno: Tamanho da fila
 */
int tamanhoDaFila();

/*
 * Verifica qual personagem está na frente na fila entre os dois passados no primeiro parâmetro.
 * Parâmetro 1: Número do personagem 1
 * Parâmetro 2: Número do personagem 2
 * Retorno: 0 se personagem1 está na frente, 1 se personagem2 está na frente.
 */
int qualPersonagemEstaNaFrente(int personagem1, int personagem2);

/*
 * Procedimento para realocar "as namoradas" na frente dos respectivos "namorados"
 */
void realocaNamorados(int Amy, int Bernardette, int Penny);

/*
 * Procedimento que coloca Amy na frente de Sheldon na fila de prioridade
 */
void colocaAmyNaFrenteSheldon();

/*
 * Procedimento que coloca Bernardette na frente de Howard na fila de prioridade
 */
void colocaBernadetteyNaFrenteHoward();

/*
 * Procedimento que coloca Penny na frente de Leonard na fila de prioridade
 */
void colocaPennyNaFrenteLeonard();
#endif /* HOUSE_H_ */
